home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
AmigaGuide.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
8KB
|
374 lines
/*
** AmigaGuide.c
**
** AmigaGuide support routines
**
** Copyright © 1990-1993 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
/* Local data. */
STATIC STRPTR ContextList[55];
STATIC AMIGAGUIDECONTEXT Context;
STATIC struct NewAmigaGuide NewGuide;
STATIC struct Process *GuideProcess;
STATIC LONG GuideContextID = CONTEXT_MAIN;
/* GuideServer(VOID):
*
* AmigaGuide server, handles all the signal processing.
*/
STATIC VOID SAVE_DS
GuideServer(VOID)
{
/* Open the help text file asynchronously... */
if(Context = OpenAmigaGuideAsync(&NewGuide,TAG_DONE))
{
ULONG GuideMask,Signals;
BOOL Done = FALSE;
/* Pick up the signal notification mask. */
GuideMask = AmigaGuideSignal(Context);
/* Clear the context stack. */
SetAmigaGuideContext(Context,0,TAG_DONE);
/* Flag the main process to continue. */
Signal((struct Task *)ThisProcess,SIG_HANDSHAKE);
/* Go into input loop. */
do
{
/* Wait for a signal... */
Signals = Wait(SIG_KILL | GuideMask);
/* Are we to quit? */
if(Signals & SIG_KILL)
Done = TRUE;
/* Process icoming AmigaGuide messages. */
if(Signals & GuideMask)
{
struct AmigaGuideMsg *GuideMessage;
while(GuideMessage = GetAmigaGuideMsg(Context))
ReplyAmigaGuideMsg(GuideMessage);
}
}
while(!Done);
/* Close the help text file. */
CloseAmigaGuide(Context);
}
/* Lock & quit. */
Forbid();
GuideProcess = NULL;
Signal((struct Task *)ThisProcess,SIG_HANDSHAKE);
}
/* GuideLaunch(LONG ContextID):
*
* Launch the AmigaGuide help file server.
*/
STATIC BOOL
GuideLaunch(LONG ContextID)
{
/* Is the main program running and is this the
* main program to make the call?
*/
if(Window && FindTask(NULL) == (struct Task *)ThisProcess)
{
/* Is the help file server already running? */
if(!GuideProcess)
{
if(!AmigaGuideBase)
AmigaGuideBase = OpenLibrary("amigaguide.library",0);
if(AmigaGuideBase)
{
BOOL IsValidFile = TRUE;
/* Do we have a valid AmigaGuide file name? */
if(Config->PathConfig->HelpFile[0])
{
if(!GetFileSize(Config->PathConfig->HelpFile))
IsValidFile = FALSE;
}
else
IsValidFile = FALSE;
/* Do we have a valid AmigaGuide file name? */
if(!IsValidFile)
{
/* Don't pop up the file requester if any
* time-critical services are currently running!
*/
if(ContextID == CONTEXT_TRANSFER || ContextID == CONTEXT_DIAL)
{
DisplayBeep(Window->WScreen);
return(FALSE);
}
else
{
UBYTE DummyBuffer[MAX_FILENAME_LENGTH];
struct FileRequester *FileRequest;
/* Provide a default name if necessary. */
if(!Config->PathConfig->HelpFile[0])
strcpy(Config->PathConfig->HelpFile,"PROGDIR:term.guide");
/* Block the windows. */
BlockWindows();
/* Get file and path name. */
LimitedStrcpy(sizeof(DummyBuffer),DummyBuffer,Config->PathConfig->HelpFile);
/* Get the help text file name. */
if(FileRequest = OpenSingleFile(Window,LocaleString(MSG_PATHPANEL_SELECT_HELP_FILE_TXT),LocaleString(MSG_GLOBAL_SELECT_TXT),NULL,DummyBuffer,sizeof(DummyBuffer)))
{
FreeAslRequest(FileRequest);
if(GetFileSize(DummyBuffer))
{
LimitedStrcpy(sizeof(Config->PathConfig->HelpFile),Config->PathConfig->HelpFile,DummyBuffer);
IsValidFile = TRUE;
}
}
/* Release the windows... */
ReleaseWindows();
}
}
/* Do we finally have a valid file name? */
if(IsValidFile)
{
STATIC LONG NodeTable[] =
{
MSG_TERMAMIGAGUIDE_NODE_00_TXT,
MSG_TERMAMIGAGUIDE_NODE_01_TXT,
MSG_TERMAMIGAGUIDE_NODE_02_TXT,
MSG_TERMAMIGAGUIDE_NODE_03_TXT,
MSG_TERMAMIGAGUIDE_NODE_04_TXT,
MSG_TERMAMIGAGUIDE_NODE_05_TXT,
MSG_TERMAMIGAGUIDE_NODE_06_TXT,
MSG_TERMAMIGAGUIDE_NODE_07_TXT,
MSG_TERMAMIGAGUIDE_NODE_08_TXT,
MSG_TERMAMIGAGUIDE_NODE_09_TXT,
MSG_TERMAMIGAGUIDE_NODE_10_TXT,
MSG_TERMAMIGAGUIDE_NODE_11_TXT,
MSG_TERMAMIGAGUIDE_NODE_12_TXT,
MSG_TERMAMIGAGUIDE_NODE_13_TXT,
MSG_TERMAMIGAGUIDE_NODE_14_TXT,
MSG_TERMAMIGAGUIDE_NODE_15_TXT,
MSG_TERMAMIGAGUIDE_NODE_16_TXT,
MSG_TERMAMIGAGUIDE_NODE_17_TXT,
MSG_TERMAMIGAGUIDE_NODE_18_TXT,
MSG_TERMAMIGAGUIDE_NODE_19_TXT,
MSG_TERMAMIGAGUIDE_NODE_20_TXT,
MSG_TERMAMIGAGUIDE_NODE_21_TXT,
MSG_TERMAMIGAGUIDE_NODE_22_TXT,
MSG_TERMAMIGAGUIDE_NODE_23_TXT,
MSG_TERMAMIGAGUIDE_NODE_24_TXT,
MSG_TERMAMIGAGUIDE_NODE_25_TXT,
MSG_TERMAMIGAGUIDE_NODE_26_TXT,
MSG_TERMAMIGAGUIDE_NODE_27_TXT,
MSG_TERMAMIGAGUIDE_NODE_28_TXT,
MSG_TERMAMIGAGUIDE_NODE_29_TXT,
MSG_TERMAMIGAGUIDE_NODE_30_TXT,
MSG_TERMAMIGAGUIDE_NODE_31_TXT,
MSG_TERMAMIGAGUIDE_NODE_32_TXT,
MSG_TERMAMIGAGUIDE_NODE_33_TXT,
MSG_TERMAMIGAGUIDE_NODE_34_TXT,
MSG_TERMAMIGAGUIDE_NODE_35_TXT,
MSG_TERMAMIGAGUIDE_NODE_36_TXT,
MSG_TERMAMIGAGUIDE_NODE_37_TXT,
MSG_TERMAMIGAGUIDE_NODE_38_TXT,
MSG_TERMAMIGAGUIDE_NODE_39_TXT,
MSG_TERMAMIGAGUIDE_NODE_40_TXT,
MSG_TERMAMIGAGUIDE_NODE_41_TXT,
MSG_TERMAMIGAGUIDE_NODE_42_TXT,
MSG_TERMAMIGAGUIDE_NODE_43_TXT,
MSG_TERMAMIGAGUIDE_NODE_44_TXT,
MSG_TERMAMIGAGUIDE_NODE_45_TXT,
MSG_TERMAMIGAGUIDE_NODE_46_TXT,
MSG_TERMAMIGAGUIDE_NODE_47_TXT,
MSG_TERMAMIGAGUIDE_NODE_48_TXT,
MSG_TERMAMIGAGUIDE_NODE_49_TXT,
MSG_TERMAMIGAGUIDE_NODE_50_TXT,
MSG_TERMAMIGAGUIDE_NODE_51_TXT,
MSG_TERMAMIGAGUIDE_NODE_52_TXT,
MSG_TERMAMIGAGUIDE_NODE_53_TXT,
-1
};
/* Provide the context node names (note: language
* specific!).
*/
LocalizeStringTable(ContextList,NodeTable);
/* Clear the instance. */
memset(&NewGuide,0,sizeof(struct NewAmigaGuide));
/* Fill in the structure. */
NewGuide.nag_BaseName = "termHelp";
NewGuide.nag_Name = Config->PathConfig->HelpFile;
NewGuide.nag_ClientPort = "TERM_HELP";
NewGuide.nag_Context = ContextList;
NewGuide.nag_Screen = Window->WScreen;
/* Launch the server process. */
GuideProcess = StartProcessWaitForHandshake("term AmigaGuide Process",(TASKENTRY)GuideServer,TAG_DONE);
}
}
}
/* Pop the main screen to the front if necessary. */
if(GuideProcess)
{
ScreenToFront(Window->WScreen);
return(TRUE);
}
else
{
if(AmigaGuideBase)
{
CloseLibrary(AmigaGuideBase);
AmigaGuideBase = NULL;
}
DisplayBeep(Window->WScreen);
return(FALSE);
}
}
else
{
if(GuideProcess && Window)
{
ScreenToFront(Window->WScreen);
return(TRUE);
}
else
return(FALSE);
}
}
/* GuideCleanup():
*
* Terminate the AmigaGuide server and free the
* associated resources.
*/
VOID
GuideCleanup()
{
ShakeHands((struct Task *)GuideProcess,SIG_KILL);
if(AmigaGuideBase)
{
CloseLibrary(AmigaGuideBase);
AmigaGuideBase = NULL;
}
}
/* GuideContext(LONG NewContextID):
*
* Set the global AmigaGuide context.
*/
VOID
GuideContext(LONG NewContextID)
{
GuideContextID = NewContextID;
}
ULONG SAVE_DS ASM
GuideSetupHook(REG(a0) struct Hook *UnusedHook,REG(a2) HelpMsg *UnusedHelpMessage,REG(a1) struct IBox *UnusedBounds)
{
if(GuideLaunch(GuideContextID))
{
SetAmigaGuideContext(Context,GuideContextID,TAG_DONE);
SendAmigaGuideContext(Context,TAG_DONE);
return(TRUE);
}
else
return(FALSE);
}
/* GuideSetup():
*
* Try to display the currently selected AmigaGuide
* help text.
*/
VOID
GuideSetup()
{
if(GuideLaunch(GuideContextID))
{
SetAmigaGuideContext(Context,GuideContextID,TAG_DONE);
SendAmigaGuideContext(Context,TAG_DONE);
}
}
/* GuideDisplay(LONG ContextID):
*
* Try to display an AmigaGuide help text.
*/
VOID
GuideDisplay(LONG ContextID)
{
if(GuideLaunch(ContextID))
{
SetAmigaGuideContext(Context,ContextID,TAG_DONE);
SendAmigaGuideContext(Context,TAG_DONE);
}
}